<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libCZI: using libCZI</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(initResizable);
/* @license-end */</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" async src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">libCZI
   </div>
   <div id="projectbrief">Reading CZI documents made easy</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('using_naczirlib.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">using <a class="el" href="namespacelib_c_z_i.html" title="External interfaces, classes, functions and structs are found in the namespace &quot;libCZI&quot;. ">libCZI</a> </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h2>Opening a CZI-file</h2>
<p>The first thing you want to do with a CZI-file is to open it. This is done with the CZIReader-object. An instance of a CZIReader is created with the function</p>
<div class="fragment"><div class="line">std::shared_ptr&lt;ICZIReader&gt; <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">CreateCZIReader</a>()</div></div><!-- fragment --><p>The CZIReader-object has the following methods</p>
<div class="fragment"><div class="line"><span class="keyword">virtual</span> <span class="keywordtype">void</span> Open(std::shared_ptr&lt;IStream&gt; stream);</div><div class="line"><span class="keyword">virtual</span> std::shared_ptr&lt;IMetadataSegment&gt; ReadMetadataSegment();</div><div class="line"><span class="keyword">virtual</span> std::shared_ptr&lt;IAccessor&gt; CreateAccessor(AccessorType accessorType);</div><div class="line"><span class="keyword">virtual</span> <span class="keywordtype">void</span> Close();</div><div class="line"></div><div class="line"><span class="comment">// ... some omitted</span></div><div class="line"><span class="keyword">virtual</span> SubBlockStatistics GetStatistics();</div></div><!-- fragment --><p>With the Open-method, the caller has to pass in an object which implements the interface "IStream". This object is used by the CZIReader in order to access the data in a CZI-file. It is just the abstraction of a random-access stream. <a class="el" href="namespacelib_c_z_i.html" title="External interfaces, classes, functions and structs are found in the namespace &quot;libCZI&quot;. ">libCZI</a> includes a (simple) implementation for reading a file which is constructed by passing in a filename:</p>
<div class="fragment"><div class="line">std::shared_ptr&lt;IStream&gt; <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">CreateStreamFromFile</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* szFilename)</div></div><!-- fragment --><p>When the Open-method has executed, the sub-block directory has been read and parsed, and the remaing methods can be called. This code can be used to open a CZI-file:</p>
<div class="fragment"><div class="line"><span class="keyword">auto</span> stream = <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">libCZI::CreateStreamFromFile</a>(LR<span class="stringliteral">&quot;(D:\CZI\sample.czi)&quot;);</span></div><div class="line"><span class="stringliteral"></span><span class="keyword">auto</span> cziReader = <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">libCZI::CreateCZIReader</a>();</div><div class="line">cziReader-&gt;Open(stream); </div></div><!-- fragment --><p>The <code>SubBlockStatistics</code> gives information about the sub-blocks in the CZI-file. The coordinates of each sub-block are examined, and the mininum and maximum are determined and are available in the struct returned by the method <code>ISubBlockRepository::GetStatistics()</code>. It is usually important to examine the dimBounds member in order to determine which dimensions are used in the CZI-file.</p>
<h2>Reading sub-blocks in a CZI-file</h2>
<p>All the sub-blocks in the CZI-file can be enumerated by the method <code>ISubBlockRepository::EnumerateSubBlocks</code>:</p>
<div class="fragment"><div class="line"><span class="keyword">virtual</span> <span class="keywordtype">void</span> EnumerateSubBlocks(std::function&lt;<span class="keywordtype">bool</span>(<span class="keywordtype">int</span> index, <span class="keyword">const</span> SubBlockInfo&amp; info)&gt; funcEnum) </div></div><!-- fragment --><p>This code will print some of the information for all sub-blocks contained in a CZI-file:</p>
<div class="fragment"><div class="line"><span class="keyword">auto</span> stream = <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">libCZI::CreateStreamFromFile</a>(LR<span class="stringliteral">&quot;(W:\Data\TestData\DCV_30MB.czi)&quot;);</span></div><div class="line"><span class="stringliteral"></span><span class="keyword">auto</span> cziReader = <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">libCZI::CreateCZIReader</a>();</div><div class="line">cziReader-&gt;Open(stream);</div><div class="line">cziReader-&gt;EnumerateSubBlocks(</div><div class="line">    [](<span class="keywordtype">int</span> idx, <span class="keyword">const</span> <a class="code" href="structlib_c_z_i_1_1_sub_block_info.html">libCZI::SubBlockInfo</a>&amp; info)</div><div class="line">{</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;Index &quot;</span> &lt;&lt; idx &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; <a class="code" href="classlib_c_z_i_1_1_utils.html#aeb42843e65615302b51b68ad2b376e6d">libCZI::Utils::DimCoordinateToString</a>(&amp;info.<a class="code" href="structlib_c_z_i_1_1_sub_block_info.html#ae4acf2922fe594327d1c6fbfb2062781">coordinate</a>) &lt;&lt; <span class="stringliteral">&quot; Rect=&quot;</span> &lt;&lt; info.logicalRect &lt;&lt; endl;</div><div class="line">    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line">});</div></div><!-- fragment --><p>It will print out something like: </p><pre class="fragment">...
Index 4: Z4C0T0 Rect=(0,0,512,512)
Index 5: Z5C0T0 Rect=(0,0,512,512)
Index 6: Z6C0T0 Rect=(0,0,512,512)
Index 7: Z7C0T0 Rect=(0,0,512,512)
Index 8: Z8C0T0 Rect=(0,0,512,512)
Index 9: Z9C0T0 Rect=(0,0,512,512)
Index 10: Z10C0T0 Rect=(0,0,512,512)
Index 11: Z11C0T0 Rect=(0,0,512,512)
Index 12: Z12C0T0 Rect=(0,0,512,512)
Index 13: Z13C0T0 Rect=(0,0,512,512)
Index 14: Z14C0T0 Rect=(0,0,512,512)
...
</pre><p>The index argument we got here is used to identify a sub-block and can be used with the method <code>ISubBlockRepository::ReadSubBlock</code>. This code will enumerate all sub-blocks found in a CZI-file, read them and save them to a PNG-file:</p>
<div class="fragment"><div class="line"><span class="keyword">auto</span> stream = <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">libCZI::CreateStreamFromFile</a>(LR<span class="stringliteral">&quot;(W:\Data\TestData\DCV_30MB.czi)&quot;);</span></div><div class="line"><span class="stringliteral"></span><span class="keyword">auto</span> cziReader = <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">libCZI::CreateCZIReader</a>();</div><div class="line">cziReader-&gt;Open(stream);</div><div class="line">cziReader-&gt;EnumerateSubBlocks(</div><div class="line">    [&amp;](<span class="keywordtype">int</span> idx, <span class="keyword">const</span> <a class="code" href="structlib_c_z_i_1_1_sub_block_info.html">libCZI::SubBlockInfo</a>&amp; info)</div><div class="line">{</div><div class="line">    <span class="keyword">auto</span> sbBlk = cziReader-&gt;ReadSubBlock(idx);</div><div class="line">    <span class="keyword">auto</span> bitmap = sbBlk-&gt;CreateBitmap();</div><div class="line">    wstring filename(L<span class="stringliteral">&quot;SubBlock#&quot;</span>);</div><div class="line">    filename += to_wstring(idx);</div><div class="line">    filename += L<span class="stringliteral">&quot;.PNG&quot;</span>;</div><div class="line">    SaveAsPng(filename, bitmap);</div><div class="line">    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line">});</div></div><!-- fragment --><p>Note that the function <code>SaveAsPng</code> is not part of <a class="el" href="namespacelib_c_z_i.html" title="External interfaces, classes, functions and structs are found in the namespace &quot;libCZI&quot;. ">libCZI</a>. It is also worth noting that the <code>ISubBlock::CreateBitmap</code> method will transparently decode the bitmap (in case we have a compressed bitmap in the sub-block).</p>
<h2>creating multi-tile composites</h2>
<p>This piece of code will extract a small rectangular region from a huge multi-tile document:</p>
<div class="fragment"><div class="line"><span class="keyword">auto</span> stream = <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">libCZI::CreateStreamFromFile</a>(LR<span class="stringliteral">&quot;(D:\PICTURES\NaCZIrTestData\Example_TMA1_Zeb1_SPRR2_Ck19_S100-1-1-1-1.czi)&quot;);</span></div><div class="line"><span class="stringliteral"></span><span class="keyword">auto</span> cziReader = <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">libCZI::CreateCZIReader</a>();</div><div class="line">cziReader-&gt;Open(stream);</div><div class="line"><span class="keyword">auto</span> statistics = cziReader-&gt;GetStatistics();</div><div class="line"><span class="keyword">auto</span> accessor = cziReader-&gt;CreateSingleChannelTileAccessor();</div><div class="line"><a class="code" href="classlib_c_z_i_1_1_c_dim_coordinate.html">libCZI::CDimCoordinate</a> planeCoord{ { NaCZIr::DimensionIndex::C,1 } };   <span class="comment">// the document only contains C-dimension</span></div><div class="line"><span class="keyword">auto</span> multiTileComposit = accessor-&gt;Get(</div><div class="line">    <a class="code" href="structlib_c_z_i_1_1_int_rect.html">libCZI::IntRect</a>{ statistics.boundingBox.<a class="code" href="structlib_c_z_i_1_1_int_rect.html#a7a1e25fc9f6a4c99d9a3710446b7a5de">x</a> + 26152, statistics.boundingBox.y + 32215 ,3000,2200 },</div><div class="line">    &amp;planeCoord,</div><div class="line">    <span class="keyword">nullptr</span>);   <span class="comment">// use default options</span></div><div class="line">SaveAsPng(LR<span class="stringliteral">&quot;(D:\TileComposite.png)&quot;, multiTileComposit);</span></div></div><!-- fragment --><p>Note that we are using the <code>SubBlockStatistics</code> in order to specify a ROI with coordinates relative to the upper left corner of the bounding box. The result is depicted here:</p>
<div class="image">
<img src="SingleChannelTileAccessor_3.PNG" alt="SingleChannelTileAccessor_3.PNG"/>
<div class="caption">
single channel tile accessor</div></div>
<p>Here is an example which leverages the SingleChannelScalingTileAccessor:</p>
<div class="fragment"><div class="line"><span class="keyword">auto</span> stream = <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">libCZI::CreateStreamFromFile</a>(LR<span class="stringliteral">&quot;(D:\PICTURES\NaCZIrTestData\Example_TMA1_Zeb1_SPRR2_Ck19_S100-1-1-1-1.czi)&quot;);</span></div><div class="line"><span class="stringliteral"></span><span class="keyword">auto</span> cziReader = <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">libCZI::CreateCZIReader</a>();</div><div class="line">cziReader-&gt;Open(stream);</div><div class="line"><span class="keyword">auto</span> statistics = cziReader-&gt;GetStatistics();</div><div class="line"><span class="keyword">auto</span> accessor = cziReader-&gt;CreateSingleChannelScalingTileAccessor();</div><div class="line">NaCZIr::CDimCoordinate planeCoord{ { <a class="code" href="namespacelib_c_z_i.html#a55049658acf59d0eddfaebcad16df424a0d61f8370cad1d412f80b84d143e1257">libCZI::DimensionIndex::C</a>,1 } }; <span class="comment">// the document only contains C-dimension, we choose channel#1</span></div><div class="line"><span class="keyword">auto</span> multiTileComposit = accessor-&gt;Get(</div><div class="line">    <a class="code" href="structlib_c_z_i_1_1_int_rect.html">libCZI::IntRect</a>{</div><div class="line">            statistics.boundingBox.<a class="code" href="structlib_c_z_i_1_1_int_rect.html#a7a1e25fc9f6a4c99d9a3710446b7a5de">x</a> + statistics.boundingBox.w / 4,</div><div class="line">            statistics.boundingBox.y + statistics.boundingBox.h / 4 ,</div><div class="line">            (statistics.boundingBox.w / 8) * 5,</div><div class="line">            (statistics.boundingBox.h / 8) * 5 },</div><div class="line">    &amp;planeCoord,</div><div class="line">    0.1f,</div><div class="line">    <span class="keyword">nullptr</span>);</div><div class="line">SaveAsPng(LR<span class="stringliteral">&quot;(D:\ScalingTileComposite.png)&quot;, multiTileComposit);</span></div></div><!-- fragment --><p>The ROI is now x= \(\frac{width}{4}\), y= \(\frac{height}{4}\), w= \(\frac{5}{8}\cdot width\), h= \(\frac{5}{8}\cdot height\) - where \(width\) and \(height\) refer to the width and height of the bounding box of the document. <br />
The zoom is given as 0.1 - so the resulting document will have width= \(0.1\times\frac{5}{8}\cdot width\) and height=width= \(0.1\times\frac{5}{8}\cdot height\).</p>
<p>This operaton is depicted here:</p>
<div class="image">
<img src="SingleChannelTileAccessor_4.PNG" alt="SingleChannelTileAccessor_4.PNG"/>
<div class="caption">
single channel scaling tile accessor</div></div>
 <h2>creating a multi-channel composite</h2>
<p>In order to create a colorful picture from a bunch of channels (usually grayscale), we need to apply a color to it - that's refered to as "tinting". Furthermore, we want to apply a gradation curve. All the required parameters for this are refered to as "display settings". In a CZI-file we can find display settings in the metadata. <br />
The following sample is reading the display settings from the metadata; then we get a (scaled) multi-tile composite for each of the channels (more exactly: only for those channels which are marked 'active' in the display settings). Those bitmaps are then fed into a function which will produce the multi-channel-composite (according to the display settings).</p>
<div class="fragment"><div class="line"><span class="keyword">auto</span> stream = <a class="code" href="namespacelib_c_z_i.html#a8783cf40c0eac418632db90c4f20b43b">libCZI::CreateStreamFromFile</a>(LR<span class="stringliteral">&quot;(D:\PICTURES\NaCZIrTestData\Example_TMA1_Zeb1_SPRR2_Ck19_S100-1-1-1-1.czi)&quot;);</span></div><div class="line"><span class="stringliteral"></span><span class="keyword">auto</span> cziReader = <a class="code" href="namespacelib_c_z_i.html#abe978d8bd50abe94c2d37df6212859e8">libCZI::CreateCZIReader</a>();</div><div class="line">cziReader-&gt;Open(stream);</div><div class="line"><span class="keyword">auto</span> statistics = cziReader-&gt;GetStatistics();</div><div class="line"></div><div class="line"><span class="comment">// get the display-setting from the document&#39;s metadata</span></div><div class="line"><span class="keyword">auto</span> mds = cziReader-&gt;ReadMetadataSegment();</div><div class="line"><span class="keyword">auto</span> md = mds-&gt;CreateMetaFromMetadataSegment();</div><div class="line"><span class="keyword">auto</span> docInfo = md-&gt;GetDocumentInfo();</div><div class="line"><span class="keyword">auto</span> dsplSettings = docInfo-&gt;GetDisplaySettings();</div><div class="line"></div><div class="line"><a class="code" href="structlib_c_z_i_1_1_int_rect.html">libCZI::IntRect</a> roi{</div><div class="line">    statistics.boundingBox.<a class="code" href="structlib_c_z_i_1_1_int_rect.html#a7a1e25fc9f6a4c99d9a3710446b7a5de">x</a> + statistics.boundingBox.w / 4,</div><div class="line">    statistics.boundingBox.y + statistics.boundingBox.h / 4 ,</div><div class="line">    (statistics.boundingBox.w / 8) * 5, (statistics.boundingBox.h / 8) * 5 };</div><div class="line"></div><div class="line"><span class="comment">// get the tile-composite for all channels (which are marked &#39;active&#39; in the display-settings)</span></div><div class="line">std::vector&lt;shared_ptr&lt;libCZI::IBitmapData&gt;&gt; actvChBms;</div><div class="line"><span class="keywordtype">int</span> index = 0;  <span class="comment">// index counting only the active channels</span></div><div class="line">std::map&lt;int, int&gt; activeChNoToChIdx;   <span class="comment">// we need to keep track which &#39;active channels&quot; corresponds to which channel index</span></div><div class="line"><span class="keyword">auto</span> accessor = cziReader-&gt;CreateSingleChannelScalingTileAccessor();</div><div class="line">libCZI::CDisplaySettingsHelper::EnumEnabledChannels(dsplSettings.get(),</div><div class="line">    [&amp;](<span class="keywordtype">int</span> chIdx)-&gt;<span class="keywordtype">bool</span></div><div class="line">{</div><div class="line">    <a class="code" href="classlib_c_z_i_1_1_c_dim_coordinate.html">libCZI::CDimCoordinate</a> planeCoord{ { <a class="code" href="namespacelib_c_z_i.html#a55049658acf59d0eddfaebcad16df424a0d61f8370cad1d412f80b84d143e1257">libCZI::DimensionIndex::C</a>, chIdx } };</div><div class="line">    actvChBms.emplace_back(accessor-&gt;Get(roi, &amp;planeCoord, 0.05f, <span class="keyword">nullptr</span>));</div><div class="line">    activeChNoToChIdx[chIdx] = index++;</div><div class="line">    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line">});</div><div class="line"></div><div class="line"><span class="comment">// initialize the helper with the display-settings and provide the pixeltypes </span></div><div class="line"><span class="comment">// (for each active channel)</span></div><div class="line">libCZI::CDisplaySettingsHelper dsplHlp;</div><div class="line">dsplHlp.Initialize(dsplSettings.get(), </div><div class="line">    [&amp;](<span class="keywordtype">int</span> chIdx)-&gt;<a class="code" href="namespacelib_c_z_i.html#abf8ce12ab88b06c8b3b47efbb5e2e834">libCZI::PixelType</a> { <span class="keywordflow">return</span> actvChBms[activeChNoToChIdx[chIdx]]-&gt;GetPixelType(); });</div><div class="line"></div><div class="line"><span class="comment">// pass the tile-composites we just created (and the display-settings for the those active </span></div><div class="line"><span class="comment">//  channels) into the multi-channel-composor-function</span></div><div class="line"><span class="keyword">auto</span> mcComposite = <a class="code" href="classlib_c_z_i_1_1_compositors.html#ab9be96d1b2b2e48c60c4dbf967e593c1">libCZI::Compositors::ComposeMultiChannel_Bgr24</a>(</div><div class="line">    dsplHlp.GetActiveChannelsCount(),</div><div class="line">    std::begin(actvChBms),</div><div class="line">    dsplHlp.GetChannelInfosArray());</div><div class="line"></div><div class="line">SaveAsPng(LR<span class="stringliteral">&quot;(D:\ScalingTileComposite_MultiChannelComposite.png)&quot;, mcComposite);</span></div></div><!-- fragment --><p>In this sample we used the same document and ROI as before. The CZI-file in this case contained 5 channels (and all being 'active'), so we had to get 5 tile-composites (using the SingleChannelScalingTileAccessor), which are then all put into the <code>ComposeMultiChannel_Bgr24</code> function (alongside with the corresponding display-settings). The function will produce a new bitmap (always of pixeltype Bgr24) which then contains the multi-channel-composite image. In this process we leveraged a utility <code>CDisplaySettingsHelper</code> which hides some of the book-keeping (among other things, it helps sorting out the 'active' channels and it converts the display-settings we got from the document's metadata into the form expected by the <code>ComposeMultiChannel_Bgr24</code> function).</p>
<p>The complete operation is depicted here:</p>
<div class="image">
<img src="ScalingSingleChannelTileAccessor1.png" alt="ScalingSingleChannelTileAccessor1.png"/>
<div class="caption">
multi-channel-composite from a (scaled) tile-composite</div></div>
 </div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
  </ul>
</div>
</body>
</html>
